﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace AlgorithmTest
{
    // T_[四个数字排序]_[算法名]
    public class T_0184_LowestCommonAncestor : IAlgorithm
    {
        // 236. 二叉树的最近公共祖先

        // 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
        // 百度百科中最近公共祖先的定义为：“对于有根树 T 的两个节点 p、q，最近公共祖先表示为一个节点 x，
        // 满足 x 是 p、q 的祖先且 x 的深度尽可能大（一个节点也可以是它自己的祖先）。”

        // 提示：
        //  树中节点数目在范围[2, 10^5] 内。
        //  -10^9 <= Node.val <= 10^9
        //  所有 Node.val 互不相同 。
        //  p ! = q
        //  p 和 q 均存在于给定的二叉树中。


        public void Test()
        {
            // 算法参数定义

            // 算法执行与打印
            //Console.WriteLine(Algorithm());
        }

        // 算法
        public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
        {
            DFS(root, p, q);
            return ans;
        }

        private TreeNode ans = new TreeNode();

        private bool DFS(TreeNode root, TreeNode p, TreeNode q)
        {
            if (root == null) return false;
            bool lson = DFS(root.left, p, q);
            bool rson = DFS(root.right, p, q);
            if ((lson && rson) || ((root.val == p.val || root.val == q.val) && (lson || rson)))
            {
                ans = root;
            }
            return lson || rson || root.val == p.val || root.val == q.val;
        }
    }
}
